home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A).zip
/
Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A).po
/
MERGESORT.OBJ.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
11KB
|
491 lines
*
* MERGESORT.S
* BY CHESTER H. PAGE
* (C) 1988 MICROSPARC, INC.
* CONCORD, MA 01742
*
TEXT EQU $0
KEEP EQU $0 dual names for dual use of
NODE EQU $2 pointers, for readability
PTR EQU $2 of source remarks
HOLD EQU $4
NEXTA EQU $6 Pointers to next
NEXTB EQU $8 lists to be merged
START EQU $A
FINISH EQU $CE
S1 EQU $1A
S2 EQU $1E
LETTER EQU $D6 $40 for testing for caps
MARK EQU $D7 Holds delimiter
N EQU $EB
INDEX EQU $ED
LINE EQU $EF
FLAG EQU $F9
TEMP EQU $F9
TXTLOAD EQU $1600 Start of text area
HEADLIST EQU $8E00
SLIST EQU $9200 Stringlist, node list
COUNT EQU $9200
COUT EQU $FDED
ORG $1200
JMP TXTEND
JMP LOAD
JMP MAKELIST
JMP PRESHOW
TXTEND LDA #2 prepare parmlist for
STA $300 PRODOS GET.EOF
LDA #1
STA $301
JSR $BF00 call PRODOS MLI to get
DB $D1 length of file
DW $300 address of parmlist
LDA $302 build pointer to storage
STA TEXT position of EOF
CLC
LDA $303
ADC #<TXTLOAD
STA TEXT+1
LDY #0
TYA
STA (TEXT),Y load a 00 at EOF
RTS
LOAD LDA #$40 Initialize, and load text
STA LETTER
LDY #0 clear node area
STY NODE for convenience
LDA #<HEADLIST in analysis and
STA NODE+1 debugging
L0 LDA #0
STA (NODE),Y
INY
BNE L0
INC NODE+1
LDA NODE+1
CMP #$9A
BNE L0
LDA #>SLIST initialize START pointer
STA START
LDA #<SLIST
STA START+1
LDY #3
STA (START),Y
DEY
LDA #>SLIST
CLC
ADC #4
STA (START),Y
LDY #0
STY TEXT
LDA #<TXTLOAD initialize text pointer
STA TEXT+1
LDA #>SLIST
CLC
ADC #4
STA NODE
LDA #<SLIST
STA NODE+1
LDA (TEXT),Y
STA MARK save first text character
L1 INY
LDA (TEXT),Y
BEQ L2 end of file
CMP MARK
BNE L1
DEY
TYA
LDY #0
STA (TEXT),Y mark replaced by length
STA TEMP of following string
LDA TEXT
STA (NODE),Y mark-address as node value
INY
LDA TEXT+1
STA (NODE),Y
SEC
LDA TEMP advance text pointer
ADC TEXT
STA TEXT
LDA TEXT+1
ADC #0
STA TEXT+1
CLC
INY
LDA NODE advance node, enter link
ADC #4
STA (NODE),Y
STA TEMP
INY
LDA NODE+1
ADC #0
CMP #$9A
BCC L3
STA $1A
RTS
L3 STA (NODE),Y
STA NODE+1
LDA TEMP
STA NODE
LDY #0
BEQ L1
L2 LDY #0 enter terminating dummy,
TYA a string greater than
STA (TEXT),Y can occur in the list
INY
LDX #6
LDA #$FF
DUMMY STA (TEXT),Y
INY
INY
DEX
BNE DUMMY
LDY #2
LDX #5
LDA #$D
D1 STA (TEXT),Y
INY
INY
DEX
BNE D1
LDY #0
LDA TEXT
STA (NODE),Y
INY
LDA TEXT+1
STA (NODE),Y
INY
LDA NODE link dummy to itself
STA FINISH at address called
STA (NODE),Y FINISH
INY
LDA NODE+1
STA FINISH+1
STA (NODE),Y
SEC
LDA FINISH
SBC #>SLIST
STA COUNT
LDA FINISH+1
SBC #<SLIST
STA COUNT+1
LSR COUNT+1
ROR COUNT
LSR COUNT+1
ROR COUNT
RTS
OFFSET LDA INDEX offset into HEADLIST
STA PTR
LDA INDEX+1
STA PTR+1
ASL PTR
ROL PTR+1 twice the index
LDA PTR
ADC #>HEADLIST
STA PTR
LDA PTR+1
ADC #<HEADLIST
STA PTR+1
RTS
FETCH JSR OFFSET fetch node address at
LDY #0 indexed location
LDA (PTR),Y
STA HOLD
INY
LDA (PTR),Y
STA HOLD+1
RTS
STORE JSR OFFSET store node address at
LDY #0 indexed location
LDA HOLD
STA (PTR),Y
INY
LDA HOLD+1
STA (PTR),Y
RTS
MAKELIST LDA COUNT build list of nodes
STA N in their linked order
LDA COUNT+1
STA N+1
LDA #0
STA INDEX
STA INDEX+1
LDY #2 init pointers
LDA (START),Y
STA HOLD
INY
LDA (START),Y
STA HOLD+1
LDA #>HEADLIST
STA NODE
LDA #<HEADLIST
STA NODE+1 pointers set
M1 JSR STORE
INY
LDA (HOLD),Y
STA NEXTA
INY
LDA (HOLD),Y
STA NEXTA+1
LDA FINISH+1
STA (HOLD),Y
DEY
LDA FINISH
STA (HOLD),Y
DEC N
BNE M2
LDA N+1
BEQ SORT
DEC N+1
M2 LDA NEXTA
STA HOLD
LDA NEXTA+1
STA HOLD+1
INC INDEX
BNE M1
INC INDEX+1
JMP M1
SORT LDA COUNT get NEXTA, NEXTB from
STA N HEADLIST
LDA COUNT+1
STA N+1
SO1 LDA #0
STA INDEX
STA INDEX+1
SO2 JSR FETCH
LDA HOLD
STA NEXTA
LDA HOLD+1
STA NEXTA+1
INC INDEX
BNE SO3
INC INDEX+1
SO3 JSR FETCH
LDA HOLD
STA NEXTB
LDA HOLD+1
STA NEXTB+1
JSR MERGE
LDY #2
LDA (START),Y
STA HOLD
INY
LDA (START),Y
STA HOLD+1
LDA INDEX temp storage of index
STA KEEP
LDA INDEX+1
STA KEEP+1
LSR INDEX+1 halve the index
ROR INDEX
JSR STORE
LDA KEEP restore index
STA INDEX
LDA KEEP+1
STA INDEX+1
INC INDEX
BNE SO4
INC INDEX+1
SO4 SEC
LDA N
SBC INDEX
STA KEEP
LDA N+1
SBC INDEX+1
BNE SO2
LDA KEEP
CMP #1
BCC SO5
BNE SO2
JSR FETCH
LDA INDEX
STA KEEP
LDA INDEX+1
STA KEEP+1
LSR INDEX+1
ROR INDEX
JSR STORE
LDA KEEP
STA INDEX
LDA KEEP+1
STA INDEX+1
SO5 INC N
BNE SO6
INC N+1
SO6 LSR N+1
ROR N
LDA N+1
BNE SO7
LDA N
CMP #1
BNE SO7
RTS
SO7 JMP SO1
MERGE LDA START
STA NODE
LDA START+1
STA NODE+1
JSR VALUES
JSR UPDATE
ME1 JSR VALUES
JSR UPDATE
LDA NODE
CMP FINISH
BNE ME1
LDA NODE+1
CMP FINISH+1
BNE ME1
RTS
VALUES LDY #0 get string addresses
LDA (NEXTA),Y
STA S1
LDA (NEXTB),Y
STA S2
INY
LDA (NEXTA),Y
STA S1+1
LDA (NEXTB),Y
STA S2+1
RTS
UPDATE JSR COMPARE
LDA FLAG
BEQ U1
*LINK TO S2, POINT TO S2, ADVANCE NEXTB TO ITS LINK
LDY #2
LDA NEXTB
STA (NODE),Y
INY
LDA NEXTB+1
STA (NODE),Y
LDA NEXTB
STA NODE
LDA NEXTB+1
STA NODE+1
LDY #2
LDA (NODE),Y
STA NEXTB
INY
LDA (NODE),Y
STA NEXTB+1
RTS
*as above, but for S1 and NEXTA
U1 LDY #2
LDA NEXTA
STA (NODE),Y
INY
LDA NEXTA+1
STA (NODE),Y
LDA NEXTA
STA NODE
LDA NEXTA+1
STA NODE+1
LDY #2
LDA (NODE),Y
STA NEXTA
INY
LDA (NODE),Y
STA NEXTA+1
RTS
COMPARE LDY #0
STY FLAG assume S1<=S2
LDA LINE find n-th CR
CMP #1
BEQ CLOOP
TAX
C1 DEX
BEQ C2
C5 INY
LDA (S1),Y
CMP #$D
BNE C5
BEQ C1
C2 CLC
TYA
ADC S1 advance starting address
STA S1 to line beginning
LDA S1+1
ADC #0
STA S1+1
LDA LINE find n-th CR
TAX
LDY #0
C3 DEX
BEQ C4
C6 INY
LDA (S2),Y
CMP #$D
BNE C6
BEQ C3
C4 CLC
TYA
ADC S2 advance starting address
STA S2 to line beginning
LDA S2+1
ADC #0
STA S2+1
LDY #0
CLOOP INY character comparison loop
LDA (S1),Y
CMP #$D
BEQ CL1
BIT LETTER
BEQ CL2
AND #$DF capitalize for comparison
CL2 STA HOLD
LDA (S2),Y
CMP #$D
BEQ CL3
BIT LETTER
BEQ CL4
AND #$DF
CL4 CMP HOLD compare characters
BEQ CLOOP
BCS CL1
CL3 LDA #1
STA FLAG S2<S1
CL1 RTS
PRESHOW LDA START
STA NEXTA
LDA START+1
STA NEXTA+1
FIND.S LDY #2 find next string
LDA (NEXTA),Y
STA NODE
INY
LDA (NEXTA),Y
STA NODE+1
STA NEXTA+1
LDA NODE
STA NEXTA
LDY #0
LDA (NODE),Y
STA HOLD
INY
LDA (NODE),Y
STA HOLD+1
LDY #0
LDA (HOLD),Y
BEQ P1
TAX
LDA FLAG non-zero when saving
BEQ PRINT to disk
LDA MARK
JSR COUT
PRINT INY
LDA (HOLD),Y
ORA #$80 for benefit of screen
JSR COUT
BIT $C000
BPL P2
LDA $C000
CMP #$9B
BEQ DONE
P2 DEX
BNE PRINT
JMP FIND.S
P1 LDA FLAG check for disk save
BEQ DONE
LDA MARK restore closing mark
JSR COUT
DONE BIT $C010
RTS
LST NOA,NOV